R in SQL
작금의 시대를 살아가면서 데이터의 중요성은 다시 설명하지 않아도 되는 사실이 되었습니다. 수많은 데이터가 제공하는 정보를 찾아내고 가공해서 인사이트를 발견하는 것이 우리의 행동에 근거를 더 해 주고 있습니다. Data-Driven을 통한 의사결정이 방향에 대해 확신을 심어주는 것입니다. 그로인해 데이터를 소유하는 것과 데이터를 다루는 기술이 자연스럽게 스포트라이트를 받았습니다. 이 글에서는 데이터를 저장하고 관리하는 SQL DB와 데이터를 다루는 언어인 R이 새로운 방식으로 어떻게 작동하는지 간단하게 살펴보겠습니다.
'R'이 뭐에요?
R은 (창조)목적 부터 데이터를 다루기 위해 만들어졌습니다. 데이터를 탐색하고 표현하며, 분석하여 유의미한 결과를 내는 것을 목적으로 통계학자들의 요구로부터 탄생되었습니다. 그렇게 탄생한 R은 데이터에 관심 있는 모두가 사용할 수 있도록 무료로 제공되고 있습니다.
- In-Memory Computing
- Package
- Object-oriented Programming
- Free
다양한 통계분석부터, 데이터 분석을 위한 데이터 전처리, 데이터 변환, 시각화 등을 구현할 수 있도록 지원해주고 있습니다. 또한 머신러닝을 구현할 수 있는 다양한 패키지도 제공하고 있어, 통계전문가, 분석가들 뿐만 아니라, 데이터를 다루는 것에 관심있는 모두에게 인기가 많은 언어입니다.
SQL 내에서 R 사용하기
R은 데이터를 다루는 언어이고, 대부분의 데이터는 따로 저장되어 있습니다. 개인의 PC에 있기도 하고, 그보다 발전된 형태라면 DB를 구축하고 DB에 데이터를 보관하고 있을 것입니다. R은 In-Memory 방식이기 때문에, 데이터를 R의 메모리에 불러와야 분석이 가능합니다. 전통의 방법은 RDBMS와 R을 연동해서 DB로부터 필요한 데이터를 불러와 R에 Load해 데이터분석을 진행합니다. 데이터 분석의 결과를 다시 DB에 저장하거나 새로운 형태로 표출하는 것으로 데이터 분석은 마무리 됩니다.
DB와 R간의 연결이 이루어져야 데이터 Load가 가능해지고 그렇게 Load된 데이터로 분석을 진행하는 방법이 전통적인 방법이라면, 이번에 새로운 방법을 소개하려 합니다.
MSSQL에서 제공하는 기능인 R in SQL을 활용하면 DB와 R이 각각 연동되어야 분석을 할 수 있는 것이 아닌 SQL내에서 R 스크립트를 실행 시킬 수 있게 됩니다. 즉, 데이터의 이동없이 DB내에서 R 스크립트를 통해 분석이 가능하고, 더 나아가 생성된 머신러닝 모델 자체를 저장하고 꺼내쓰는 작업까지 가능하게 되는 것입니다.
스크립트 실행
R의 기본적은 문법은 알고 있다는 가정하에, SQL 내에서 R을 실행시키는 방법을 살펴봅니다.
SQL에서 R 스크립트를 실행하려면, R스크립트를 시스템 저장 프로시저 sp_execute_external_script에 대한 인수로 전달해야 합니다. 데이터의 Load 없이 R 스크립트 자체의 문법을 실행시킬 수도 있습니다.
SQL에서 사용할 언어, Input_Data, Output_Data의 타입을 정의한 후 실행시킬 스크립트를 작성하여 실행합니다.
SQL에서 가져온 Input_Data와 R자체에서 생성한 데이터간의 데이터핸들링 작업도 가능합니다. SQL 내에서 단순히 R의 문법을 사용하는 것이 아니라, R에서 실행할 수 있는 기능들도 지원하고 있습니다.
SQL 내에서 R의 문법을 지원하는 것은 위에서 이미 살펴보았습니다. R in SQL에서 더 주목할 점은, 변동하는 값들에 대해 파라미터로 전달 할 수 있다는 것입니다. R스크립트에 고정된 값의 데이터만 전달하는것이 아니라, 때에 따라 변화하는 값을 파라미터로 전달 할 수 있습니다. R 스크립트 내에서 파라미터를 인자로 받아 데이터 처리가 가능함은 실로 유용하지 않을 수 없습니.
SQL 내에서 ML 모델 생성/저장/호출/실행
모델을 생성하는 저장 프로시저 만들기
- SQL로 부터 Input_Data를 받아 Machine Learning 모델을 만드는 R 스크립트를 저장합니다.
- R에서 생성된 머신러닝 모델을 SQL DB에 저장할 수 있도록 serialize화 한 후 Output으로 전달합니다.
- 이 일련의 과정을 (Input_Data를 학습하여 머신러닝 모델 생성하는 과정) 프로시저로 통해 구현합니다.
모델을 데이터베이스에 저장
- 머신러닝 모델을 저장할 테이블을 생성한 후, 전 단계에서 만든 '머신러닝 모델을 생성하는 프로시저'를 실행합니다.
- 실행의 결과로 머신러닝 모델이 Output으로 반환되면, 반환된 모델을 테이블에 저장합니다.
예측을 수행하는 저장 프로시저 생성
생성된 머신러닝 모델에 새로운 데이터를 입력하여 예측결과를 반환하고 싶은 요구가 있습니다. 기존에 'Train Data를 통해 생성한 머신러닝 모델'을 호출한 후 새로운 데이터를 입력하여 예측값을 확인해 봅니다.
- 모델을 저장하는 테이블에서 '기존에 만든 머신러닝 모델'을 호출하여 R 스크립트에 인자값으로 넘겨줍니다. 모델을 전달하면서 새로운 Input_Data 또한 같이 넘겨줍니다.
- R 스크립트에 넘어온 모델은 Serialize되어있으므로, 해당 모델을 Unserialize를 통해 모델의 형태로 변형해준다.
- 호출한 모델에 새로운 데이터를 입력하여 예측값을 생성하고, 생성된 예측값을 SQL에 Output으로 전달합니다
- 모델을 호출하고, 새로운 데이터를 입력하여 결과값을 반환하는 일련의 과정을 하나의 프로시저로 생성합니다.
새 데이터로 모델 실행
위에서 생성한 프로시저를 호출하여 Output결과를 반환합니다. 예측하고자 하는 데이터를 입력하고 반환값으로 예측값을 얻습니다.
마무리
간단한 R 실습 예제와, R을 통한 머신러닝 예제까지 SQL에서 돌아가는 프로세스를 확인하였습니다. 기존에는 RDBMS에서 데이터를 불러와 R내에서 데이터 핸들링 작업을 진행했다면, SQL 내에서 R 분석엔진을 활용하여 데이터의 이동 없이 분석을 진행하는 작업이 가능해졌습니다.
상황에 따라 '기존의 분석방법'과 '새로이 탐색해본 R in SQL 방법' 중 적절히 선택해서 활용할 수 있다는 사실 자체가 분석가, 또는 개발에게 더 풍성한 도구 선택의 영역을 제공해줍니다. 제공되는 다양한 솔루션을 활용하여 데이터 분석이 우리의 삶에 더 친숙해지길 바랍니다.